// utils/login.js
/**
 * 微信小程序登录相关工具函数
 */

// 后端接口基础地址
const BACKEND_BASE_URL = 'http://39.106.63.45:8002'

/**
 * 获取微信登录code
 * @returns {Promise} 返回包含code的Promise
 */
export function getLoginCode() {
  return new Promise((resolve, reject) => {
    wx.login({
      success: (res) => {
        if (res.code) {
          console.log('获取到登录code:', res.code)
          resolve(res.code)
        } else {
          console.error('wx.login失败: 未获取到code')
          reject(new Error('未获取到登录code'))
        }
      },
      fail: (err) => {
        console.error('wx.login调用失败:', err)
        reject(err)
      }
    })
  })
}

/**
 * 获取用户信息（头像、昵称、性别、地区等）
 * @returns {Promise} 返回用户信息Promise
 */
export function getUserProfile() {
  return new Promise((resolve, reject) => {
    wx.getUserProfile({
      desc: '用于完善用户资料',
      success: (res) => {
        console.log('获取用户信息成功:', res.userInfo)
        resolve(res.userInfo)
      },
      fail: (err) => {
        console.error('获取用户信息失败:', err)
        reject(err)
      }
    })
  })
}

/**
 * 获取手机号码
 * @returns {Promise} 返回手机号码Promise
 */
export function getPhoneNumber(e) {
  return new Promise((resolve, reject) => {
    if (e.detail.errMsg === 'getPhoneNumber:ok') {
      // 这里需要将code发送到后端解密获取手机号
      // 由于微信限制，前端无法直接获取手机号明文
      resolve({
        success: true,
        code: e.detail.code
      })
    } else {
      reject(new Error('用户拒绝授权手机号'))
    }
  })
}

/**
 * 检查登录状态
 * @returns {boolean} 是否已登录
 */
export function checkLoginStatus() {
  try {
    const isLoggedIn = wx.getStorageSync('isLoggedIn')
    const userInfo = wx.getStorageSync('userInfo')
    return !!(isLoggedIn && userInfo)
  } catch (e) {
    console.error('检查登录状态失败:', e)
    return false
  }
}

/**
 * 获取用户信息
 * @returns {Object|null} 用户信息对象或null
 */
export function getUserInfo() {
  try {
    return wx.getStorageSync('userInfo') || null
  } catch (e) {
    console.error('获取用户信息失败:', e)
    return null
  }
}

/**
 * 设置登录状态
 * @param {Object} userInfo 用户信息
 */
export function setLoginStatus(userInfo) {
  try {
    wx.setStorageSync('userInfo', userInfo)
    wx.setStorageSync('isLoggedIn', true)
    console.log('登录状态已设置:', userInfo)
  } catch (e) {
    console.error('设置登录状态失败:', e)
  }
}

/**
 * 清除登录状态
 */
export function clearLoginStatus() {
  try {
    wx.removeStorageSync('userInfo')
    wx.removeStorageSync('isLoggedIn')
    console.log('登录状态已清除')
  } catch (e) {
    console.error('清除登录状态失败:', e)
  }
}

/**
 * 微信一键登录（调用后端接口）
 * @param {string} code 微信登录code
 * @param {Object} userInfo 用户信息（昵称、头像、性别、地区等）
 * @returns {Promise} 登录结果Promise
 */
export function wxLogin(code, userInfo) {
  return new Promise((resolve, reject) => {
    // 构建请求数据
    const requestData = {
      code: code,
      userInfo: {
        nickName: userInfo.nickName || '',
        avatarUrl: userInfo.avatarUrl || '',
        phoneNumber: userInfo.phoneNumber || '',
        gender: userInfo.gender || 0,
        province: userInfo.province || '',
        city: userInfo.city || ''
      }
    }
    
    console.log('发送登录请求数据:', requestData)
    
    wx.request({
      url: `${BACKEND_BASE_URL}/user/wx-login`,
      method: 'POST',
      data: requestData,
      header: {
        'content-type': 'application/json'
      },
      success: (res) => {
        console.log('后端登录响应:', res)
        if (res.statusCode === 200 && res.data.code === 200) {
          // 登录成功
          const backendUserInfo = res.data.data
          console.log('后端返回的用户信息:', backendUserInfo)
          
          // 将后端返回的用户信息转换为前端需要的格式
          const frontendUserInfo = {
            nickName: backendUserInfo.nickname || userInfo.nickName,
            avatarUrl: backendUserInfo.avatarUrl || userInfo.avatarUrl,
            phoneNumber: backendUserInfo.phone || userInfo.phoneNumber,
            openid: backendUserInfo.openid,
            unionid: backendUserInfo.unionid,
            gender: backendUserInfo.gender || userInfo.gender || 0,
            province: backendUserInfo.province || userInfo.province || '',
            city: backendUserInfo.city || userInfo.city || '',
            cardNo: '123456789' // 可以根据实际需求设置
          }
          
          console.log('转换后的前端用户信息:', frontendUserInfo)
          
          resolve({
            success: true,
            userInfo: frontendUserInfo,
            backendData: backendUserInfo
          })
        } else {
          // 登录失败
          console.error('登录失败:', res.data)
          reject(new Error(res.data.msg || '登录失败'))
        }
      },
      fail: (err) => {
        console.error('请求后端登录接口失败:', err)
        reject(new Error('网络请求失败'))
      }
    })
  })
}

/**
 * 完整的微信登录流程
 * @returns {Promise} 登录结果Promise
 */
export function performWxLogin() {
  return new Promise(async (resolve, reject) => {
    try {
      console.log('开始微信登录流程...')
      
      // 1. 获取微信登录code
      const code = await getLoginCode()
      console.log('获取到登录code:', code)
      
      // 2. 获取用户信息（头像、昵称、性别、地区）
      const userInfo = await getUserProfile()
      console.log('获取到用户信息:', userInfo)
      
      // 3. 调用后端登录接口
      const loginResult = await wxLogin(code, userInfo)
      console.log('后端登录成功:', loginResult)
      
      // 4. 保存登录状态
      setLoginStatus(loginResult.userInfo)
      
      resolve(loginResult)
      
    } catch (error) {
      console.error('微信登录流程失败:', error)
      reject(error)
    }
  })
}

/**
 * 自动登录（如果已登录则直接返回用户信息）
 * @returns {Promise} 用户信息Promise
 */
export function autoLogin() {
  return new Promise((resolve, reject) => {
    if (checkLoginStatus()) {
      const userInfo = getUserInfo()
      resolve(userInfo)
    } else {
      reject(new Error('未登录'))
    }
  })
}
